#include <iostream>
#include <typeinfo>
#include <vector>
#include <string>
#include <array>
#include <list>
#include <forward_list>
#include <set>
#include <map>
#include <deque>

using namespace std;
void _display_type(random_access_iterator_tag)
{
	cout << "random_access_iterator_tag" << endl;
}
void _display_type(bidirectional_iterator_tag)
{
	cout << "bidirectional_iterator_tag" << endl;
}
void _display_type(forward_iterator_tag)
{
	cout << "forward_iterator_tag" << endl;
}
void _display_type(output_iterator_tag)
{
	cout << "output_iterator_tag" << endl;
}
void _display_type(input_iterator_tag)
{
	cout << "input_iterator_tag " << endl;
}
template<class T> void display_type(T itr)
{
	typename iterator_traits<T>::iterator_category cagy;
	_display_type(cagy);
	cout << "typeid(itr),name()=" << typeid(itr).name() << endl;
}
int main()
{
	display_type(array<int, 10>::iterator());
	display_type(vector<int>::iterator());
	display_type(list<int>::iterator());
	display_type(forward_list<int>::iterator());
	display_type(deque<int>::iterator());
	display_type(set<int>::iterator());
	display_type(map<int,int>::iterator());
	display_type(multiset<int>::iterator());
	display_type(multimap<int,int>::iterator());
	display_type(istream_iterator<int>());
	display_type(ostream_iterator<int>(cout,""));
	
	return 0;
}